import { Injectable } from '@nestjs/common';
import { WeChatPayService } from './wechat-pay.service';
import { AlipayService } from './alipay.service';
import { ApplePayService } from './apple-pay.service';
import { YooMoneyService } from './yoomoney.service';
import { MirPayService } from './mir-pay.service';
import { StripeService } from './stripe.service';

// 定义支付方式接口
export interface PaymentMethod {
  id: string;
  name: string;
  description: string;
  icon: string; // 图标URL
}

// 定义地区支付方式配置
export interface RegionalPaymentMethods {
  [countryCode: string]: PaymentMethod[];
}

@Injectable()
export class PaymentMethodsService {
  // 地区支付方式配置
  private regionalPaymentMethods: RegionalPaymentMethods = {
    // 中国大陆
    CN: [
      {
        id: 'wechat-pay',
        name: '微信支付',
        description: '使用微信支付进行充值',
        icon: 'wechat-pay-icon-url',
      },
      {
        id: 'alipay',
        name: '支付宝',
        description: '使用支付宝进行充值',
        icon: 'alipay-icon-url',
      },
    ],
    // 日本
    JP: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'apple-pay',
        name: 'Apple Pay',
        description: '使用Apple Pay进行充值',
        icon: 'apple-pay-icon-url',
      },
    ],
    // 韩国
    KR: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
    ],
    // 东南亚国家
    SG: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    TH: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    VN: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    ID: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    MY: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    PH: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    // 欧洲国家
    GB: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    DE: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    FR: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    IT: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    ES: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    NL: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    SE: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    NO: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    DK: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    FI: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    // 乌克兰
    UA: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    // 北美
    US: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    CA: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    // 澳洲
    AU: [
      {
        id: 'stripe-card',
        name: '信用卡支付',
        description: '通过Stripe使用信用卡支付',
        icon: 'stripe-icon-url',
      },
      {
        id: 'paypal',
        name: 'PayPal',
        description: '使用PayPal进行充值',
        icon: 'paypal-icon-url',
      },
    ],
    // 俄罗斯
    RU: [
      {
        id: 'yoomoney',
        name: 'YooMoney',
        description: '使用YooMoney进行充值',
        icon: 'yoomoney-icon-url',
      },
      {
        id: 'mir',
        name: 'MIR',
        description: '使用MIR卡进行支付',
        icon: 'mir-icon-url',
      },
    ],
  };

  constructor(
    private readonly wechatPayService: WeChatPayService,
    private readonly alipayService: AlipayService,
    private readonly applePayService: ApplePayService,
    private readonly yooMoneyService: YooMoneyService,
    private readonly mirPayService: MirPayService,
    private readonly stripeService: StripeService,
  ) {}

  /**
   * 根据国家代码获取可用的支付方式
   * @param countryCode 国家代码 (ISO 3166-1 alpha-2)
   * @returns 该地区的支付方式列表
   */
  getPaymentMethodsByCountry(countryCode: string): PaymentMethod[] {
    // 查找特定国家的支付方式
    const methods = this.regionalPaymentMethods[countryCode];

    // 如果找不到特定国家的支付方式，则返回默认支付方式（Stripe + PayPal）
    if (!methods) {
      return [
        {
          id: 'stripe-card',
          name: '信用卡支付',
          description: '通过Stripe使用信用卡支付',
          icon: 'stripe-icon-url',
        },
        {
          id: 'paypal',
          name: 'PayPal',
          description: '使用PayPal进行充值',
          icon: 'paypal-icon-url',
        },
      ];
    }

    return methods;
  }

  /**
   * 获取所有支持的国家/地区及其支付方式
   * @returns 所有地区的支付方式配置
   */
  getAllRegionalPaymentMethods(): RegionalPaymentMethods {
    return this.regionalPaymentMethods;
  }

  /**
   * 处理微信支付
   */
  async processWeChatPay(
    amount: number,
    description: string,
    openid?: string,
  ): Promise<any> {
    // 生成订单ID
    const orderId = `ORDER_${Date.now()}_${Math.floor(Math.random() * 1000)}`;

    // 调用微信支付服务创建订单
    // 将amount数字转换为字符串传递
    return await this.wechatPayService.createOrder(
      orderId,
      amount.toString(),
      description,
      openid,
    );
  }

  /**
   * 处理支付宝支付
   */
  async processAlipay(amount: number, description: string): Promise<any> {
    return await this.alipayService.createOrder(amount, description);
  }

  /**
   * 处理Apple Pay支付
   */
  async processApplePay(paymentData: any, amount: number): Promise<any> {
    const isValid = await this.applePayService.validatePayment(paymentData);
    if (isValid) {
      return await this.applePayService.processPayment(paymentData, amount);
    }
    throw new Error('Apple Pay payment validation failed');
  }

  /**
   * 处理YooMoney支付
   */
  async processYooMoney(amount: number, description: string): Promise<any> {
    return await this.yooMoneyService.createOrder(amount, description);
  }

  /**
   * 处理MIR支付
   */
  async processMirPay(amount: number, description: string): Promise<any> {
    return await this.mirPayService.createOrder(amount, description);
  }
}